package core

import (
	"bytes"
	"fmt"
	"io"
	"mcp-demo/configs"
	"mcp-demo/internal/config/cmodel"
	"mcp-demo/internal/global"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// Viper 配置
func Viper() *viper.Viper {

	envNow := global.ENV

	if envNow == "" {
		er := bytes.NewReader(configs.ConfigEnv)
		// 获取项目根路径
		env_v := viper.New()
		env_v.SetConfigType("yaml")
		err := env_v.ReadConfig(er)
		if err != nil {
			panic(fmt.Errorf("环境配置加载失败: %w", err))
		}
		var env cmodel.ENV
		if err = env_v.Unmarshal(&env); err != nil {
			panic(fmt.Errorf("环境配置解析失败!: %w", err))
		}

		// 不填默认为dev
		if env.Env == "" {
			env.Env = "dev"
		}
		envNow = env.Env
		global.ENV = env.Env
	}

	var r io.Reader
	switch envNow {
	case "dev":
		r = bytes.NewReader(configs.ConfigDev)
	case "test":
		r = bytes.NewReader(configs.ConfigTest)
	case "prod":
		r = bytes.NewReader(configs.ConfigProd)
	case "prod_local":
		r = bytes.NewReader(configs.ConfigProdLocal)
	default:
		r = bytes.NewReader(configs.ConfigDev)
	}

	v := viper.New()
	v.SetConfigType("yaml")
	err := v.ReadConfig(r)
	if err != nil {
		panic(fmt.Errorf("加载配置文件失败: %w", err))
	}
	v.WatchConfig()

	v.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("配置文件已改变:", e.Name)
		if err = v.Unmarshal(&global.CONFIG); err != nil {
			fmt.Println(err)
		}
	})
	if err = v.Unmarshal(&global.CONFIG); err != nil {
		panic(fmt.Errorf("配置文件解析失败: %w", err))
	}
	return v
}
